home *** CD-ROM | disk | FTP | other *** search
/ QRZ! Ham Radio 8 / QRZ Ham Radio Callsign Database - Volume 8.iso / mac / files / t_sys5 / unixcpio.gz / unixnet.cpio / nr4.h < prev    next >
C/C++ Source or Header  |  1994-07-11  |  9KB  |  310 lines

  1. /* nr4.h:  defines for netrom layer 4 (transport) support.
  2.  * Copyright 1989 by Daniel M. Frank, W9NK.  Permission granted for
  3.  * non-commercial distribution only.
  4.  */
  5.  
  6. /* compile-time limitations */
  7.  
  8. #define    NR4MAXCIRC    20        /* maximum number of open circuits */
  9. #define NR4MAXWIN    127        /* maximum window size, send and receive */
  10.                             
  11. /* protocol limitation: */
  12.  
  13. #define    NR4MAXINFO    236        /* maximum data in an info packet */
  14.  
  15. /* sequence number wraparound mask */
  16.  
  17. #define NR4SEQMASK    0xff    /* eight-bit sequence numbers */
  18.  
  19. /* flags in high nybble of opcode byte */
  20.  
  21. #define    NR4CHOKE    0x80
  22. #define    NR4NAK        0x40
  23. #define    NR4MORE        0x20    /* The "more follows" flag for */
  24.                             /* pointless packet reassembly */
  25.  
  26. /* mask for opcode nybble */
  27.  
  28. #define    NR4OPCODE    0x0f
  29.  
  30. /* opcodes */
  31.  
  32. #define NR4OPPID    0        /* protocol ID extension to network layer */
  33. #define    NR4OPCONRQ    1        /* connect request */
  34. #define    NR4OPCONAK    2        /* connect acknowledge */
  35. #define    NR4OPDISRQ    3        /* disconnect request */
  36. #define    NR4OPDISAK    4        /* disconnect acknowledge */
  37. #define    NR4OPINFO    5        /* information packet */
  38. #define    NR4OPACK    6        /* information ACK */
  39. #define NR4NUMOPS    7        /* number of transport opcodes */
  40.  
  41. /* minimum length of NET/ROM transport header */
  42.  
  43. #define    NR4MINHDR    5
  44.  
  45. /* host format net/rom transport header */
  46.  
  47. struct nr4hdr {
  48.     unsigned char opcode ;        /* opcode and flags */
  49.     unsigned char yourindex ;    /* receipient's circuit index */
  50.     unsigned char yourid ;        /* receipient's circuit ID */
  51.     
  52.     union {
  53.  
  54.         struct {                /* network extension */
  55.             unsigned char family ;    /* protocol family */
  56.             unsigned char proto ;    /* protocol within family */
  57.         } pid ;
  58.  
  59.         struct {                /* connect request */
  60.             unsigned char myindex ;    /* sender's circuit index */
  61.             unsigned char myid ;    /* sender's circuit ID */
  62.             unsigned char window ;    /* sender's proposed window size */
  63.             struct ax25_addr user ;    /* callsign of originating user */
  64.             struct ax25_addr node ;    /* callsign of originating node */
  65.         } conreq ;
  66.  
  67.         struct {                /* connect acknowledge */
  68.             unsigned char myindex ;    /* sender's circuit index */
  69.             unsigned char myid ;    /* sender's circuit ID */
  70.             unsigned char window ;     /* accepted window size */
  71.         } conack ;
  72.  
  73.         struct {                /* information */
  74.             unsigned char txseq ;    /* sender's tx sequence number */
  75.             unsigned char rxseq ;    /* sender's rx sequence number */
  76.         } info ;
  77.  
  78.         struct {                /* information acknowledge */
  79.             unsigned char rxseq ;    /* sender's rx sequence number */
  80.         } ack ;
  81.  
  82.     } u ;    /* End of union */
  83.  
  84. } ;
  85.  
  86. /* The netrom circuit pointer structure */
  87.  
  88. struct nr4circp {
  89.     unsigned char cid ;            /* circuit ID; incremented each time*/
  90.                                 /* this circuit is used */
  91.     struct nr4cb *ccb ;            /* pointer to circuit control block, */
  92.                                 /*  NULLNR4CB if not in use */
  93. } ;
  94.  
  95. /* The circuit table: */
  96.  
  97. extern struct nr4circp Nr4circuits[NR4MAXCIRC] ;
  98.  
  99. /* A netrom send buffer structure */
  100.  
  101. struct nr4txbuf {
  102.     struct timer tretry ;        /* retry timer */
  103.     unsigned retries ;            /* number of retries */
  104.     struct mbuf *data ;            /* data sent but not acknowledged */
  105. } ;
  106.  
  107. /* A netrom receive buffer structure */
  108.  
  109. struct nr4rxbuf {
  110.     unsigned char occupied ;    /* flag: buffer in use */
  111.     struct mbuf *data ;         /* data received out of sequence */
  112. } ;
  113.  
  114. /* The netrom circuit control block */
  115.  
  116. struct nr4cb {
  117.     unsigned mynum ;            /* my circuit number */
  118.     unsigned myid ;                /* my circuit ID */
  119.     unsigned yournum ;            /* remote circuit number */
  120.     unsigned yourid ;            /* remote circuit ID */
  121.     struct ax25_addr user ;        /* callsign of originating user (if any) */
  122.     struct ax25_addr node ;        /* callsign of remote node */
  123.     struct ax25_addr luser ;    /* callsign of local "user", for connections */
  124.                                 /* that we initiate */
  125.     unsigned window ;            /* negotiated window size */
  126.  
  127.     /* Data for round trip timer calculation and setting */
  128.     
  129.     long srtt ;                    /* Smoothed round trip time */
  130.     long mdev ;                    /* Mean deviation in round trip time */
  131.     unsigned blevel ;            /* Backoff level */
  132.     unsigned txmax ;            /* The maximum number of retries among */
  133.                                 /* the frames in the window.  This is 0 */
  134.                                 /* if there are no frames in the window. */
  135.                                 /* It is used as a baseline to determine */
  136.                                 /* when to increment the backoff level. */
  137.                                 
  138.     /* flags */
  139.     
  140.     char choked ;                /* choke received from remote */
  141.     char qfull ;                /* receive queue is full, and we have */
  142.                                 /* choked the other end */
  143.     char naksent ;                /* a NAK has already been sent */
  144.  
  145.     /* transmit buffers and window variables */
  146.  
  147.     struct nr4txbuf *txbufs ;    /* pointer to array[windowsize] of bufs */
  148.     unsigned char nextosend ;    /* sequence # of next frame to send */
  149.     unsigned char ackxpected ;    /* sequence number of next expected ACK */
  150.     unsigned nbuffered ;        /* number of buffered TX frames */
  151.     struct mbuf *txq ;            /* queue of unsent data */
  152.     
  153.     /* receive buffers and window variables */
  154.  
  155.     struct nr4rxbuf *rxbufs ;    /* pointer to array[windowsize] of bufs */
  156.     unsigned char rxpected ;    /* # of next receive frame expected */
  157.     unsigned char rxpastwin ;    /* top of RX window + 1 */ 
  158.     struct mbuf *rxq ;            /* "fully" received data queue */
  159.  
  160.     /* Connection state */
  161.     
  162.     int state ;                    /* connection state */
  163. #define NR4STDISC    0            /* disconnected */
  164. #define NR4STCPEND    1            /* connection pending */
  165. #define NR4STCON    2            /* connected */
  166. #define    NR4STDPEND    3            /* disconnect requested locally */
  167.  
  168.     int dreason ;                /* Reason for disconnect */
  169. #define NR4RNORMAL    0            /* Normal, requested disconnect */
  170. #define NR4RREMOTE    1            /* Remote requested */
  171. #define    NR4RTIMEOUT    2            /* Connection timed out */
  172. #define    NR4RRESET    3            /* Connection reset locally */
  173. #define NR4RREFUSED    4            /* Connect request refused */
  174.  
  175.     /* Per-connection timers */
  176.     
  177.     struct timer tchoke ;        /* choke timeout */
  178.     struct timer tack ;            /* ack delay timer */
  179.  
  180.     struct timer tcd ;            /* connect/disconnect timer */
  181.     unsigned cdtries ;            /* Number of connect/disconnect tries */
  182.     
  183.     void (*r_upcall)() ;        /* receive upcall */
  184.     void (*t_upcall)() ;        /* transmit upcall */
  185.     void (*s_upcall)() ;        /* state change upcall */
  186.  
  187.     char *puser ;                /* user pointer */
  188. } ;
  189.  
  190. #define    NULLNR4CB    (struct nr4cb *)0
  191.  
  192. /* Some globals */
  193.  
  194. extern unsigned Nr4window ;        /* The advertised window size, in frames */
  195. extern long Nr4irtt ;            /* The initial round trip time */
  196. extern unsigned Nr4retries ;    /* The number of times to retry */
  197. extern long Nr4acktime ;        /* How long to wait until ACK'ing */
  198. extern char *Nr4states[] ;        /* NET/ROM state names */
  199. extern char *Nr4reasons[] ;        /* Disconnect reason names */
  200. extern unsigned Nr4qlimit ;        /* max receive queue length before CHOKE */
  201. extern long Nr4choketime ;        /* CHOKEd state timeout */
  202.  
  203. #if    UNIX || ATARI_ST
  204. /* function definitions */
  205.  
  206. /* In nr4subr.c: */
  207.  
  208. extern int ntohnr4() ;
  209. extern struct mbuf *htonnr4() ;
  210. extern struct nr4cb *new_n4circ() ;
  211. extern int init_nr4window() ;
  212. extern void free_n4circ() ;
  213. extern struct nr4cb *match_n4circ() ;
  214. extern struct nr4cb *get_n4circ() ;
  215. extern int nr4between() ;
  216. extern void nr4defaults() ;
  217. extern int nr4valcb() ;
  218.  
  219. /* In nr4.c: */
  220.  
  221. extern void nr4sframe() ;
  222. extern void nr4rframe() ;
  223. extern void nr4sbuf() ;
  224. extern void nr4ackours() ;
  225. extern void nr4gotnak() ;
  226. extern int nr4output() ;
  227. extern void nr4state() ;
  228. extern void nr4choke() ;
  229.  
  230. /* In nr4timer.c */
  231.  
  232. extern void nr4txtimeout() ;
  233. extern void nr4ackit() ;
  234. extern void nr4cdtimeout() ;
  235. extern void nr4unchoke() ;
  236.  
  237. /* In nr4user.c: */
  238.  
  239. extern struct nr4cb *open_nr4() ;
  240. extern int send_nr4() ;
  241. extern struct mbuf *recv_nr4() ;
  242. extern void disc_nr4() ;
  243. extern void reset_nr4() ;
  244. extern int kick_nr4() ;
  245.  
  246. /* In nrcmd.c: */
  247.  
  248. extern void nr4_state() ;
  249. extern void nr4_parse() ;
  250. extern void nr4_incom() ;
  251. extern void nr4_rx() ;
  252. extern void nr4_tx() ;
  253.  
  254. #else
  255.  
  256. /* function definitions */
  257.  
  258. /* In nr4subr.c: */
  259.  
  260. extern int ntohnr4(struct nr4hdr *, struct mbuf **) ;
  261. extern struct mbuf *htonnr4(struct nr4hdr *) ;
  262. extern struct nr4cb *new_n4circ() ;
  263. extern int init_nr4window(struct nr4cb *, unsigned) ;
  264. extern void free_n4circ(struct nr4cb *) ;
  265. extern struct nr4cb *match_n4circ(int, int,
  266.                                   struct ax25_addr *, struct ax25_addr *) ;
  267. extern struct nr4cb *get_n4circ(int, int) ;
  268. extern int nr4between(unsigned, unsigned, unsigned) ;
  269. extern void nr4defaults(struct nr4cb *) ;
  270. extern int nr4valcb(struct nr4cb *) ;
  271.  
  272. /* In nr4.c: */
  273.  
  274. extern void nr4sframe(struct ax25_addr *, struct nr4hdr *, struct mbuf *) ;
  275. extern void nr4rframe(struct nr4cb *, unsigned, struct mbuf *) ;
  276. extern void nr4sbuf(struct nr4cb *, unsigned) ;
  277. extern void nr4ackours(struct nr4cb *, unsigned, int) ;
  278. extern void nr4gotnak(struct nr4cb *, unsigned) ;
  279. extern int nr4output(struct nr4cb *) ;
  280. extern void nr4state(struct nr4cb *, int) ;
  281. extern void nr4choke(struct nr4cb *) ;
  282.  
  283. /* In nr4timer.c */
  284.  
  285. extern void nr4txtimeout(char *) ;
  286. extern void nr4ackit(char *) ;
  287. extern void nr4cdtimeout(char *) ;
  288. extern void nr4unchoke(char *) ;
  289.  
  290. /* In nr4user.c: */
  291.  
  292. extern struct nr4cb *open_nr4(struct ax25_addr *, struct ax25_addr *,
  293.                               void (*)(), void (*)(), void (*)(),
  294.                               char *) ;
  295. extern int send_nr4(struct nr4cb *, struct mbuf *) ;
  296. extern struct mbuf *recv_nr4(struct nr4cb *, int16) ;
  297. extern void disc_nr4(struct nr4cb *) ;
  298. extern void reset_nr4(struct nr4cb *) ;
  299. extern int kick_nr4(struct nr4cb *) ;
  300.  
  301. /* In nrcmd.c: */
  302.  
  303. extern void nr4_state(struct nr4cb *, int, int) ;
  304. extern void nr4_parse(char *, int16) ;
  305. extern void nr4_incom(struct nr4cb *, int, int) ;
  306. extern void nr4_rx(struct nr4cb *, int16) ;
  307. extern void nr4_tx(struct nr4cb *, int16) ;
  308.  
  309. #endif
  310.